package pl.edu.pb.wi.cookbook.util;

import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Logger;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.pl.PolishAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;

public class FullTextSearchUtil {
    private static final Logger log = Logger.getLogger(FullTextSearchUtil.class
            .getName());

    private final static Set<String> STOP_WORDS = new HashSet<String>(
            Arrays.asList(new String[] { "a", "aby", "ach", "acz",
                    "aczkolwiek", "aj", "albo", "ale", "ależ", "aż",
                    "bardziej", "bardzo", "bez", "bo", "bowiem", "by", "byli",
                    "bynajmniej", "być", "był", "była", "było", "były",
                    "będzie", "będą", "cali", "cała", "cały", "ci", "cię",
                    "ciebie", "co", "cokolwiek", "coś", "czasami", "czasem",
                    "czemu", "czy", "czyli", "daleko", "dla", "dlaczego",
                    "dlatego", "do", "dobrze", "dokąd", "dość", "dużo", "dwa",
                    "dwaj", "dwie", "dwoje", "dziś", "dzisiaj", "gdy", "gdyby",
                    "gdyż", "gdzie", "gdziekolwiek", "gdzieś", "go", "i",
                    "ich", "ile", "im", "inna", "inne", "inny", "innych", "iż",
                    "ja", "ją", "jak", "jakaś", "jakby", "jaki", "jakichś",
                    "jakie", "jakiś", "jakiż", "jakkolwiek", "jako", "jakoś",
                    "je", "jeden", "jedna", "jedno", "jednak", "jednakże",
                    "jego", "jej", "jemu", "jest", "jestem", "jeszcze",
                    "jeśli", "jeżeli", "już", "ją", "każdy ", "kiedy", "kilka",
                    "kimś", "kto", "ktokolwiek", "ktoś", "która", "które",
                    "którego", "której", "który", "których", "którym",
                    "którzy", "ku", "lat", "lecz", "lub", "ma", "mają", "mam",
                    "mi", "mimo", "między", "mną", "mnie", "mogą", "moi",
                    "moim", "moja", "moje", "może", "możliwe", "można", "mój",
                    "mu", "musi", "my", "na", "nad", "nam", "nami", "nas",
                    "nasi", "nasz", "nasza", "nasze", "naszego", "naszych",
                    "natomiast", "natychmiast", "nawet", "nią", "nic", "nich",
                    "nie", "niego", "niej", "niemu", "nigdy", "nim", "nimi",
                    "niż", "no", "o", "obok", "od", "około", "on", "ona",
                    "one", "oni", "ono", "oraz", "owszem", "pan", "pana",
                    "pani", "po", "pod", "podczas", "pomimo", "ponad",
                    "ponieważ", "powinien", "powinna", "powinni", "powinno",
                    "poza", "prawie", "przecież", "przed", "przede",
                    "przedtem", "przez", "przy", "roku", "również", "sam",
                    "sama", "są", "się", "skąd", "sobie", "sobą", "sposób",
                    "swoje", "są", "ta", "tak", "taka", "taki", "takie",
                    "także", "tam", "te", "tego", "tej", "ten", "teraz", "też",
                    "totobą", "tobie", "toteż", "trzeba", "tu", "tutaj",
                    "twoi", "twoim", "twoja", "twoje", "twym", "twój", "ty",
                    "tych", "tylko", "tym", "u", "w", "wam", "wami", "was",
                    "wasz", "wasza", "wasze", "we", "według", "wiele", "wielu",
                    "więc", "więcej", "wszyscy", "wszystkich", "wszystkie",
                    "wszystkim", "wszystko", "wtedy", "wy", "właśnie", "z",
                    "za", "zapewne", "zawsze", "zeznowu", "znów", "został",
                    "żaden", "żadna", "żadne", "żadnych", "że", "żeby" }));

    private static Analyzer analyzer = new PolishAnalyzer(Version.LUCENE_29,
            STOP_WORDS);

    public static final int MAXIMUM_NUMBER_OF_WORDS_TO_SEARCH = 10;
    public static final int MAXIMUM_NUMBER_OF_WORDS_TO_PUT_IN_INDEX = 250;

    public static Set<String> getTokensForIndexingOrQuery(String index,
            int maximumNumberOfTokensToReturn) {
        String indexCleanedOfHTMLTags = index.replaceAll("\\<.*?>", " ")
                .replaceAll("\\s+", " ");
        Set<String> returnSet = new HashSet<String>();

        try {
            TokenStream tokenStream = analyzer.tokenStream(null,
                    new StringReader(indexCleanedOfHTMLTags));
            CharTermAttribute charTermAttribute = (CharTermAttribute) tokenStream
                    .addAttribute(CharTermAttribute.class);

            tokenStream.reset();
            while (tokenStream.incrementToken()
                    && (returnSet.size() < maximumNumberOfTokensToReturn)) {
                returnSet.add(charTermAttribute.toString());
            }

            tokenStream.end();
            tokenStream.close();
        } catch (IOException ex) {
            log.info(String.format("Full text search error. Exception: %s",
                    ex.getMessage()));
        }

        return returnSet;
    }
}
